C# Linq where子句在实体框架中不起作用

C# Linq where子句在实体框架中不起作用,c#,entity-framework,linq,where,C#,Entity Framework,Linq,Where,此代码不工作,返回空值: var result = context.Data .Select(x => x) .Where(x => x.ID == 1) .FirstOrDefault(); 但这是: var result = context.Data.Take(1); 工作 我的问题是,为什么在使用EF和context.Data返回IEnumerable时,

此代码不工作,返回空值:

var result = context.Data
                    .Select(x => x)
                    .Where(x => x.ID == 1)
                    .FirstOrDefault();
但这是:

var result = context.Data.Take(1);
工作


我的问题是,为什么在使用EF和context.Data返回IEnumerable时,第一个代码不起作用?是的,数据包含ID等于1的元素。简单的答案是:它应该工作。尽管您的产品线可以优化为:

var v = context.Data.FirstOrDefault(x => x.ID == 1);
所以,基本上数据库中没有ID==1,或者您拼错了一些东西

如果需要IEnumerable类型,则:

var v = context.Data.Where(x => x.ID == 1);
但我宁愿使用列表:

var v = context.Data.Where(x => x.ID == 1).ToList();

这个问题实际上与实体框架无关,而是LINQ如何使用集合及其扩展方法的本质。让我们在C语言的控制台应用程序中执行一个简单的示例:

class Program
{
    public class Faker
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public Faker(int id, string name)
        {
            Id = id;
            Name = name;
        }
    }


    static void Main(string[] args)
    {
        var ls = new List<Faker>
        {
            new Faker(1, "A"),
            new Faker(2, "B")
        };

        Faker singleItem = ls.FirstOrDefault(x => x.Id == 1);
        IEnumerable<Faker> collectionWithSingleItem = ls.Where(x => x.Id == 1);

        Console.ReadLine();
    }
}
当我在“Locals”下暂停时,我会看到这样填充的变量:


Select是多余的,Where可以替换为FirstOrDefault。只要您的表中有数据,Take就可以工作,这并不奇怪,但是where-只是意味着没有ID==1的元素,您可以大大简化为context.data.FirstOrDefaultx=>x.ID==1;。如果context.Data返回IEnumerable,则与EF或LINQ2SQL无关。而且,这两种说法的作用大不相同。第一个应该返回Id==1的第一个对象,如果不存在,则返回null,第二个应该返回包含第一个对象的列表,不应用任何条件。使用.ToList将枚举转换为List@ErikPhilips-Take1.ID不会编译正如我说的,在你的数据库中没有ID==1在我的数据库中有ID==1。当我得到所有元素时,我可以用if子句得到我想要的元素。好吧,在你的问题中包括if部分如果你想得到进一步的帮助在搜索具有特定Id的特定元素时,你使用FirstOrDefault,而不是where子句,并且不使用ToList执行,例如,当您在某个地区搜索房屋时,您使用Where子句,在该地区您需要一组结果back@AydinAdn我已经知道了所有这些,我正在演示如何使查询返回不同的类型,以防有2行ID==1,但在这种情况下,这将是一个糟糕的数据库设计,你是对的,但我还有另一个问题,为什么当我键入x.Name=Name而不是ID时它不起作用?在我的示例中,没有名称,只有A或B作为POCO伪造者的Name属性。它只适用于像x=>x.Name==a这样的lambda。在.NET中,一个equals将是赋值,而不是相等的确定。