标签: linq-to-entities

如何获得Linq to Entity的最大ID?

我有一个表用户,它有一个标识列UserID,现在什么是正确的Linq to Entity代码行,它会返回最大值UserID

我试过了:

using (MyDBEntities db = new MyDBEntities())
{
    var User = db.Users.Last();
    // or
    var User = db.Users.Max();

    return user.UserID;
}
Run Code Online (Sandbox Code Playgroud)

但似乎LastMax没有得到支持.

有任何想法吗?

c# linq linq-to-entities entity-framework

75
推荐指数
4
解决办法
12万
查看次数

实体框架离开了加入

如何更改此查询以便返回所有u.usergroups?

from u in usergroups
from p in u.UsergroupPrices
select new UsergroupPricesList
{
UsergroupID = u.UsergroupID,
UsergroupName = u.UsergroupName,
Price = p.Price
};
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-entities entity-framework left-join

73
推荐指数
4
解决办法
12万
查看次数

C# - 使用属性名称作为字符串由属性排序的代码

当我将属性名称作为字符串时,对C#中的属性进行编码的最简单方法是什么?例如,我想允许用户通过他们选择的属性(使用LINQ)来订购一些搜索结果.他们将在UI中选择"order by"属性 - 当然是字符串值.有没有办法直接使用该字符串作为linq查询的属性,而不必使用条件逻辑(if/else,switch)将字符串映射到属性.反射?

从逻辑上讲,这就是我想做的事情:

query = query.OrderBy(x => x."ProductId");
Run Code Online (Sandbox Code Playgroud)

更新:我最初没有指定我正在使用Linq to Entities - 看起来反射(至少GetProperty,GetValue方法)不会转换为L2E.

.net c# linq linq-to-entities

72
推荐指数
6
解决办法
4万
查看次数

Linq to SQL是不是错过了这一点?ORM-mappers(SubSonic等)不是次优解决方案吗?

我希望社区对我对Linq to Sql和其他ORM映射器的一些看法有所了解.

我喜欢Linq to Sql以及在本机开发语言中表达数据访问逻辑(或一般CRUD操作)的想法,而不是必须处理C#和SQL之间的"阻抗不匹配".例如,要返回与业务层的EventDataSource兼容的Event实例列表,我们使用:

return db.Events.Select(c => new EventData() { EventID = c.EventID, Title = c.Title })
Run Code Online (Sandbox Code Playgroud)

如果我使用旧的SQL-to-C#构造实现它,我必须创建一个Command类,添加EventID参数(使用字符串来描述"@EventID"参数),将SQL查询字符串添加到命令类,执行命令,然后使用(cast-type)nwReader ["FieldName"]拉取每个返回的字段值,并将其分配给我创建的EventData类实例的成员(yuck).

所以,就是人们喜欢Linq/SubSonic /等的原因.并且我同意.

然而,从更大的角度来看,我看到了一些错误的东西.我的感觉是,微软也看到了一些错误,这就是为什么他们将Linq杀死为SQL并试图将人们转移到Linq to Entities.只是,我认为微软正在加倍打赌.

那么,有什么不对?

问题是有架构的宇航员,特别是在微软,他们看着Linq到Sql,并意识到它不是一个真正的数据管理工具:在C#中还有许多你不能轻易做到的事情,他们的目标是修复它. 你看到这体现在Linq to Entities背后的野心,关于Linq 的革命本质的博客文章甚至是LinqPad的挑战.

而这个问题在于,它假定SQL的问题.也就是说,为了减轻轻微的不适(SQL和C#之间的阻抗不匹配),当创可贴(Linq to SQL或类似的东西)做得很好时,微软提出了相当于太空服(完全隔离).

据我所知,开发人员非常聪明,可以掌握关系模型,然后在开发工作中智能地应用它.事实上,我会更进一步说Linq to SQL,SubSonic等已经过于复杂:学习曲线与掌握SQL本身并没有太大的不同.因为,在可预见的未来,开发人员必须掌握SQL和关系模型,我们现在面临学习两种查询/ CRUD语言的问题.更糟糕的是,Linq通常很难测试(你没有查询窗口),从我们正在做的实际工作中删除了一层(它生成了SQL),并且对于像SQL结构这样的SQL结构具有非常笨拙的支持(最好)日期处理(例如DateDiff),"拥有"甚至"分组依据".

有什么选择?就个人而言,我不需要像Linq to Entities那样的数据访问的不同模型.我更喜欢在Visual Studio中弹出一个窗口,输入并验证我的SQL,然后按一个按钮生成或补充一个C#类来封装调用.既然你已经知道了SQL,你不想只输入这样的东西:

Select EventID, Title From Events Where Location=@Location
Run Code Online (Sandbox Code Playgroud)

并最终得到一个EventData类,A)包含EventID和Title字段作为属性,B)有一个工厂方法,它将一个'Location'字符串作为参数,并生成一个List <EventData>?你必须仔细考虑对象模型(上面的例子显然没有解决这个问题),但仍然使用SQL同时消除阻抗不匹配的基本方法对我很有吸引力.

问题是:我错了吗?Microsoft是否应该重写SQL基础结构,以便您不必再学习SQL /关系数据管理? 他们可以用这种方式重写SQL基础结构吗?或者你认为在SQL之上的一个非常薄的层来消除设置参数和访问数据字段的痛苦是足够的吗?

更新我想推广到顶部的两个链接,因为我认为它们捕获了我所追求的重要方面.首先,CodeMonkey指出了一篇题为"计算机科学的越南" …

sql linq-to-entities linq-to-sql

68
推荐指数
11
解决办法
5599
查看次数

LINQ中LEFT JOIN加入实体?

我正在尝试LINQ实体.

我有以下问题:我希望它这样做:

SELECT 
     T_Benutzer.BE_User
    ,T_Benutzer_Benutzergruppen.BEBG_BE
FROM T_Benutzer

LEFT JOIN T_Benutzer_Benutzergruppen
    ON T_Benutzer_Benutzergruppen.BEBG_BE = T_Benutzer.BE_ID 
Run Code Online (Sandbox Code Playgroud)

我最接近的是这个:

        var lol = (
            from u in Repo.T_Benutzer

            //where u.BE_ID == 1
            from o in Repo.T_Benutzer_Benutzergruppen.DefaultIfEmpty()
                // on u.BE_ID equals o.BEBG_BE

            where (u.BE_ID == o.BEBG_BE || o.BEBG_BE == null)

            //join bg in Repo.T_Benutzergruppen.DefaultIfEmpty()
            //    on o.BEBG_BG equals bg.ID

            //where bg.ID == 899 

            orderby
                u.BE_Name ascending
                //, bg.Name descending

            //select u 
            select new
            {
                 u.BE_User
                ,o.BEBG_BG
                //, bg.Name 
            }
         ).ToList();
Run Code Online (Sandbox Code Playgroud)

但是这会产生与内部联接相同的结果,而不是左联接.
而且,它创建了这个完全疯狂的SQL:

SELECT 
     [Extent1].[BE_ID] AS [BE_ID] …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-entities entity-framework entity-framework-4

66
推荐指数
4
解决办法
18万
查看次数

LINQ to Entities不支持指定的类型成员.仅支持初始值设定项,实体成员和实体导航属性

var result =
    (from bd in context.tblBasicDetails
     from pd in context.tblPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
     from opd in context.tblOtherPersonalDetails.Where(x => x.UserId == bd.UserId).DefaultIfEmpty()
     select new clsProfileDate()
     {
         DOB = pd.DOB
     });

foreach (clsProfileDate prod in result)
{
    prod.dtDOB = !string.IsNullOrEmpty(prod.DOB) ? Convert.ToDateTime(prod.DOB) : DateTime.Today;
    int now = int.Parse(DateTime.Today.ToString("yyyyMMdd"));
    int dob = int.Parse(prod.dtDOB.ToString("yyyyMMdd"));
    string dif = (now - dob).ToString();
    string age = "0";
    if (dif.Length > 4)
    age = dif.Substring(0, dif.Length - 4);
    prod.Age = Convert.ToInt32(age);
}

GetFinalResult(result);
Run Code Online (Sandbox Code Playgroud)
protected void GetFinalResult(IQueryable<clsProfileDate> …
Run Code Online (Sandbox Code Playgroud)

linq-to-entities entity-framework-4

65
推荐指数
3
解决办法
9万
查看次数

"LINQ to Entities中不支持LINQ表达式节点类型'Invoke'" - 难倒!

在我以后的EF中,我试图传入一个匿名函数作为我的Linq查询的一部分.该函数将传入INT并返回BOOL(u.RelationTypeId是INT).以下是我的功能的简化版本:

public IEnumerable<UserBandRelation> GetBandRelationsByUser(Func<int, bool> relation)
{
    using (var ctx = new OpenGroovesEntities())
    {
        Expression<Func<UsersBand, bool>> predicate = (u) => relation(u.RelationTypeId);

        var relations = ctx.UsersBands.Where(predicate);

        // mapping, other stuff, back to business layer
        return relations.ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到上述错误.看起来我通过从函数构建谓词来使一切正确.有任何想法吗?谢谢.

c# linq asp.net linq-to-entities entity-framework

62
推荐指数
3
解决办法
5万
查看次数

LINQ to Entities用于减去2个日期

我正在尝试使用LINQ with Entity Framework确定两个日期之间的天数.它告诉我它不能识别System.TimeSpan类上的Subtract

这是我在LINQ查询中的哪个部分.

where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays))
Run Code Online (Sandbox Code Playgroud)

这是我在VS.NET调试器中收到的错误

{"LINQ to Entities无法识别方法'System.TimeSpan Subtract(System.DateTime)'方法,并且此方法无法转换为商店表达式."}

我是做错了还是有更好的方法来获得实体框架中2个DateTimes之间的天数?

谢谢迈克尔

datetime linq-to-entities entity-framework

59
推荐指数
4
解决办法
4万
查看次数

错误3002:映射片段的问题| c#linq to entities

我有一个控制台应用程序,我想要做的是每次应用程序运行时,日期和时间都会发送到我的数据库中的表.

表结构如下:

FTPRuns

ID int

Last Run datetime
Run Code Online (Sandbox Code Playgroud)

很简单.

我已经在我的应用程序中更新了model.edmx以反映这个新的变化,但是现在我得到了以下错误,我不完全确定它意味着什么.

错误3002:从第1330行开始映射片段时出现问题:表FTPRuns的键(FTPRuns.ID)的潜在运行时违规:列(FTPRuns.ID)在概念方面映射到EntitySet FTPRuns的属性(FTPRuns.ID)但它们没有形成EntitySet的关键属性(FTPRuns.ID,FTPRuns.LastRun).

以下是我用来更新数据库的代码片段:

 using (ModelContainer ctn = new ModelContainer())
            {
                try
                {
                    FTPRun ftp = new FTPRun
                    {
                        LastRun = DateTime.Now
                    };

                    ctn.FTPRuns.AddObject(ftp);

                    int changes = ctn.SaveChanges();

                    Console.WriteLine(changes.ToString() + " Changes saved");
                    Console.WriteLine("The LastRun Date Has Been Updated");
                }
                catch (InvalidOperationException ex)
                {
                     Console.WriteLine(ex.ToString());
                }
            }
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,我会非常感激:)

谢谢.

c# linq-to-entities edmx

59
推荐指数
5
解决办法
5万
查看次数

LINQ to Entities不支持LINQ表达式节点类型'ArrayIndex'

public List<string> GetpathsById(List<long> id)
{
    long[] aa = id.ToArray();
        long x;
    List<string> paths = new List<string>();
    for (int i = 0; i < id.Count; i++)
    {
        x = id[i];
        Presentation press = context.Presentations.Where(m => m.PresId == aa[i]).FirstOrDefault();
        paths.Add(press.FilePath);
    }
    return paths;
}
Run Code Online (Sandbox Code Playgroud)

此代码抛出以下异常: The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities.

但是,如果我提供x而不是aa[i]它的工作.

为什么?

c# linq arrays linq-to-entities entity-framework

56
推荐指数
3
解决办法
3万
查看次数