【问题标题】:Linq where clause doesn't work in Entity FrameworkLinq where 子句在实体框架中不起作用
【发布时间】:2017-11-08 19:22:37
【问题描述】:

此代码不起作用(返回 null):

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

但是这个:

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

有效。

我的问题是为什么当我使用 EF 并且 context.Data 返回 IEnumerable<Data> 时,第一个代码不起作用? (是的,数据包含 ID 等于 1 的元素)

【问题讨论】:

  • Select 是多余的,Where 可以替换为FirstOrDefault。只要您的表中有数据,Take “工作”就不足为奇了,但是 where - 只是意味着 ID == 1 没有元素
  • 顺便说一句,您可以大大简化为context.Data.FirstOrDefault(x => x.ID == 1);
  • 如果 context.Data 返回一个 IEnumerable,这与 EF 或 LINQ2SQL 无关。此外,这两种说法都做了截然不同的事情。第一个“应该”返回 Id==1 的第一个对象,如果不存在则返回 null,第二个应该返回包含第一个对象的 List,不应用任何条件。
  • 使用 .ToList() 将枚举转换为 List
  • @ErikPhilips - Take(1).ID 不会编译

标签: c# entity-framework linq where


【解决方案1】:

这是一个与实体框架无关的问题,而是 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”下暂停时,我看到变量填充如下:

【讨论】:

  • 你是对的,但我还有一个问题,为什么当我输入 x.Name="Name" 而不是 ID 时它不起作用?
  • 在我的示例中没有“名称”,只有“A”或“B”作为 POCO Faker 的名称属性。它只适用于像 (x => x.Name == "A") 这样的 lambda。 .NET 中的单个等于将是赋值而不是确定相等性。
【解决方案2】:

简单的答案是:它应该可以工作。虽然您的线路可以优化为:

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

所以,你的数据库中基本上没有ID == 1,或者你拼错了什么。

如果你想要 IEnumerable&lt;T&gt; 类型,那么:

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

但我宁愿使用列表:

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

【讨论】:

  • 如我所说,您的数据库中没有 ID == 1
  • 我的数据库中有 ID==1。当我获得所有元素时,我可以使用 if 子句获得我想要的元素。
  • 好吧,如果您需要进一步的帮助,请将 if 部分包含在您的问题中
  • 当搜索具有特定 Id 的特定元素时,您使用 FirstOrDefault,而不是 where 子句,并且不使用 ToList 执行,例如,当您在某个地区搜索 Homes 时,您使用 Where 子句,您期望返回的结果集合
  • @AydinAdn 我已经知道了这一切,我正在展示如何让您的查询返回不同的类型(如果有 2 行 ID == 1,但在这种情况下,它会是糟糕的数据库设计)
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多