JSC
JSC

Reputation: 3725

EF SingleOrDefault doesn't work on ASP.NET

I've wrote some unit-tests for my project who tests my presenters, these presenters queries an EF context with SingleOrDefault, all the unit-tests are successful. But when I run my ASP.NET application I get continuously the error "'Single' not supported by Linq to Entities?" I want to know why this behavior is kicking in? I can't find any documentation about this behavior.

I use the following code:

Presenter:

public class ManagedQueryPresenter : BasePresenterMetModel<IManagedQueriesView, ManagedQueryBeheerModel>, IWebPartPresenter
    {
        public ManagedQueryPresenter(IManagedQueriesView view) : base(view, new ManagedQueryBeheerModel()) { }

        #region IPagePresenter Members

        public void OnViewInitialize()
        {

        }

        public void OnViewInitialized()
        {

        }

        public void OnViewLoaded()
        {

        }

        #endregion

        public void OnManagedQueriesSelecting()
        {
            View.ManagedQueries = Model.GetAll();
        }

        public void OnManagedQueryInserted(ManagedQuery entity)
        {
            Model.AddManagedQuery(entity);
            View.ManagedQueries = Model.GetAll();
        }

        public void OnManagedQueryUpdated(ManagedQuery entity)
        {
            Model.UpdateManagedQuery(entity);
        }

        public void OnManagedQueryDeleted(ManagedQuery entity)
        {
            Model.DeleteManagedQuery(entity);
        }
    }

Model:

public class ManagedQueryBeheerModel : BaseModel, IModel
{
    public void AddManagedQuery(ManagedQuery entity)
    {
        ...
    }

    public void DeleteManagedQuery(ManagedQuery entity)
    {
        ...
    }

    public void UpdateManagedQuery(ManagedQuery entity)
    {
        DoEntityAction<bool>(context =>
        {
            ManagedQuery toUpdate = context.ManagedQueries.Include(q => q.ManagedQueryParameters).SingleOrDefault(x => x.ID == entity.ID);

            ...

            context.SaveChanges();

            return true;
        });
    }

    public IList<ManagedQuery> GetAll()
    {
        return DoRepositoryAction<ManagedQuery, List<ManagedQuery>>(repository => (List<ManagedQuery>)repository.GetAll());
    }

    public ManagedQuery Get(long ID)
    {
        return DoRepositoryAction<ManagedQuery, ManagedQuery>(repository => repository.GetSingleOrDefault(x => x.ID == ID));
    }
}

UnitTest:

    [TestMethod()]
    public void OnManagedQueryUpdatedTest()
    {
        IManagedQueriesView view = new MockedManagedQueriesView(); 
        ManagedQueryPresenter target = new ManagedQueryPresenter(view);
        ManagedQuery entity = ManagedQueryHelper.CreateNewRecord(target.Model);
        entity.Name += "Updated";
        target.OnManagedQueryUpdated(entity);
    }

public static class ManagedQueryHelper
    {
        public static ManagedQuery CreateNewRecord(ManagedQueryBeheerModel model)
        {
            ManagedQuery entity = new ManagedQuery
            {
                Description = "Test Query",
                Name = "Test",
                QueryText = @"SOME QUERY",
                HasOutput = true,
                Category = "Test",
            };
            model.AddManagedQuery(entity);
            return entity;
        }
    }

ASP.NET View (Codebehind of ascx):

public partial class ManagedQueriesUserControl : WebPartMangedUserControlWithPresenter<ManagedQueryPresenter>, IManagedQueriesView
    {
        protected ASPxGridView _grid;
        protected ObjectContainerDataSource _ocdsManagedQueries;

        #region IServicesView Members

        public IList<Entities.ManagedQuery> ManagedQueries
        {
            set 
            {
                _grid.ForceDataRowType(typeof(ManagedQuery));
                _ocdsManagedQueries.DataSource = value; 
            }
        }

        #endregion

        protected void _ocdsManagedQueries_Deleted(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryDeleted((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Updated(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryUpdated((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Inserted(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)
        {
            Presenter.OnManagedQueryInserted((ManagedQuery)e.Instance);
        }

        protected void _ocdsManagedQueries_Selecting(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceSelectingEventArgs e)
        {
            Presenter.OnManagedQueriesSelecting();
        }

        #region IWebPartView Members

        public bool IsValid()
        {
            return Page.IsValid;
        }

        public string ErrorText
        {
            set { }
        }

        #endregion
    }

Upvotes: 0

Views: 745

Answers (2)

JSC
JSC

Reputation: 3725

I was forgotten that unittests are by default in VS2010 written in .NET 4 and my code in .NET3.5 so therefore it isn't working. In EF4 Single(OrDefault) is supported!

Upvotes: 0

herbrandson
herbrandson

Reputation: 2417

I believe you can find the answer on this thread Error, method not supported by LINQ to Entities

Upvotes: 1

Related Questions