标签: linq-to-entities

如何在不首先加载对象的情况下从Entity Framework模型中删除对象?

我很确定我已经在某个地方看到了这个问题的答案,但是由于我在SO或谷歌上搜索了几次,我无论如何都要问它...

在Entity Framework中,删除数据对象的唯一方法似乎是

MyEntityModel ent = new MyEntityModel();
ent.DeleteObject(theObjectToDelete);
ent.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

但是,这种方法需要首先将对象加载到Controller,只是为了删除它.有没有办法删除仅引用其ID的业务对象?

如果使用Linq或Lambda表达式有更聪明的方法,那也没关系.但主要目的是避免加载数据只是为了删除它.

asp.net-mvc linq-to-entities entity-framework

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

在LINQ to Entities中按周分组

我有一个应用程序,允许用户输入他们工作的时间,我正在尝试为此构建一个良好的报告,利用LINQ to Entities.因为每个TrackedTimeTargetDate只是a的"Date"部分DateTime,所以按用户和日期对时间进行分组相对简单(为简单起见,我省略了"where"子句):

var userTimes = from t in context.TrackedTimes
                group t by new {t.User.UserName, t.TargetDate} into ut
                select new
                {
                    UserName = ut.Key.UserName,
                    TargetDate = ut.Key.TargetDate,
                    Minutes = ut.Sum(t => t.Minutes)
                };
Run Code Online (Sandbox Code Playgroud)

由于该DateTime.Month属性,按用户分组和Month只是稍微复杂一点:

var userTimes = from t in context.TrackedTimes
                group t by new {t.User.UserName, t.TargetDate.Month} into ut
                select new
                {
                    UserName = ut.Key.UserName,
                    MonthNumber = ut.Key.Month,
                    Minutes = ut.Sum(t => t.Minutes)
                };
Run Code Online (Sandbox Code Playgroud)

现在是棘手的部分.是否有可靠的方式按周分组?我根据对类似LINQ to SQL问题的响应尝试了以下内容:

DateTime firstDay = …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-entities entity-framework

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

在Entity Framework中使用OR条件进行动态查询

我正在创建一个创建一个搜索数据库的应用程序,并允许用户动态添加任何标准(大约50种可能),非常类似于以下SO问题:使用实体框架创建动态查询.我目前正在进行搜索,检查每个条件,如果它不是空白,则将其添加到查询中.

C#

var query = Db.Names.AsQueryable();
  if (!string.IsNullOrWhiteSpace(first))
      query = query.Where(q => q.first.Contains(first));
  if (!string.IsNullOrWhiteSpace(last))
      query = query.Where(q => q.last.Contains(last));
  //.. around 50 additional criteria
  return query.ToList();
Run Code Online (Sandbox Code Playgroud)

此代码在sql server中生成类似于以下内容的东西(为了便于理解,我进行了简化)

SQL

SELECT
    [Id],
    [FirstName],
    [LastName],
    ...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
  AND [LastName] LIKE '%last%'
Run Code Online (Sandbox Code Playgroud)

我现在尝试添加一种方法,通过实体框架使用C#生成以下SQL,但使用OR而不是AND,同时仍然保持动态添加条件的能力.

SQL

SELECT
    [Id],
    [FirstName],
    [LastName],
    ...etc
  FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
  OR [LastName] LIKE '%last%' <-- NOTICE THE "OR"
Run Code Online (Sandbox Code Playgroud)

通常,条件不会大于查询的两个或三个项目,但将它们组合成一个巨大的查询不是一种选择.我尝试过concat,union和intersect,他们只是复制查询并将它们与UNION连接起来.

是否有一种简单而干净的方法可以使用实体框架向动态生成的查询添加"OR"条件?

使用我的解决方案进行编辑 - 2015年9月29日

自发布以来,我注意到这已经得到了一点关注,所以我决定发布我的解决方案

// Make …
Run Code Online (Sandbox Code Playgroud)

c# linq sql-server linq-to-entities entity-framework

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

Linq to Entities,随机顺序

如何以随机顺序返回匹配的实体?
要明确这是Entity Framework的东西和LINQ to Entities.

(航空代码)

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby ?????
                                select en;
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:
我尝试将其添加到上下文中:

public Guid Random()
{
    return new Guid();
}
Run Code Online (Sandbox Code Playgroud)

并使用此查询:

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby context.Random()
                                select en;
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误:

System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Guid Random()' method, and this method cannot be translated into a store expression..
Run Code Online (Sandbox Code Playgroud)

编辑(当前代码):

IEnumerable<MyEntity> results = (from en in context.MyEntity
                                 where …
Run Code Online (Sandbox Code Playgroud)

c# linq-to-entities entity-framework

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

如何进行批量插入 - Linq to Entities

我找不到任何关于如何使用Linq to Entities进行批量/批量插入的示例.你们知道如何进行批量插入吗?

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

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

LINQ to Entity:多个连接条件

关于LINQ和多个连接的帖子很多.但是,我没有找到任何我想要加入的解决方案.

SQL等价物将是这样的:

SELECT * FROM table1 a
LEFT JOIN table2 b ON a.col1 = b.key1 AND
a.col2 = b.key2 AND
b.from_date <= now() AND
b.deleted = 0;
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的众多linq查询之一

var query = (from x in context.table1
             join y in context.table2 on new {x.col1, x.col2} equals {b.key1, b.key2} 
             into result
             from result......
Run Code Online (Sandbox Code Playgroud)

我怎样才能添加日期和删除标志的附加条件?如果我使用.Where条件,则将其视为内连接,而不是左连接.

linq linq-to-entities

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

LINQ to Entities无法识别方法'System.TimeSpan Subtract(System.DateTime)'方法

我尝试在当前日期的60天30天20天内选择数据库中的记录.

请在下面查看此查询.

 var uploads = (
                from files in _fileuploadRepository.Table
                join product in _productRepository.Table on files.Event equals product.Id
                where
                    (
                product.EventDate != null &&
                    (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
                    (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
                    &&
                files.IsSkiped == false
                select files;
            ).ToList();
Run Code Online (Sandbox Code Playgroud)

但是此查询发生错误.

在此输入图像描述

我很无能为力.请帮忙.

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

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

简单的自动化示例

我很难理解如何映射某些对象.请回答一些关于这个简单示例的问题.

示例代码

class User
{
    private int id;
    private string name;
}

class Group
{
    private int id;
    private string name;
    private List<User> users;
}

[DataContract]
public class UserDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }      
}

[DataContract]
public class GroupDto
{
    [DataMember]
    public int id { get; set; }
    [DataMember]
    public string name{ get; set; }
    [DataMember]
    public List<User> Users { get; set; }      
}
Run Code Online (Sandbox Code Playgroud)

地图集

Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<UserDto, User>(); …
Run Code Online (Sandbox Code Playgroud)

c# wcf linq-to-entities automapper

33
推荐指数
2
解决办法
9万
查看次数

奇怪的LINQ到实体异常

我正在使用LINQ语句,从各种表中选择我需要填写一些帖子/帖子后评论样式记录的信息.我得到一个有趣的例外,当我尝试迭代记录集时,该对象必须实现IConvertible.关于它的有趣部分是它似乎只发生在我用来保存数据的匿名类型包含2个以上的泛型集合时.

//select friend timeline posts posts
var pquery = from friend in fquery
    join post in db.game_timeline on friend.id equals post.user_id
    //join user in db.users on post.friend_id equals user.id into userGroup
    //join game in db.games on post.game_id equals game.game_id into gameGroup
    select new
    {
        Friend = friend,
        Post = post,

        Game = from game in db.games
          where game.game_id == post.game_id
          select game,

        Recipient = from user in db.users
          where user.id == post.user_id
          select user,

        Comments = from comment in db.timeline_comments …
Run Code Online (Sandbox Code Playgroud)

.net c# mysql linq linq-to-entities

32
推荐指数
1
解决办法
1155
查看次数

在Entity Framework LINQ查询中使用IEnumerable.Contains时如何避免查询计划重新编译?

我使用Entity Framework(v6.1.1)执行以下LINQ查询:

private IList<Customer> GetFullCustomers(IEnumerable<int> customersIds)
{
    IQueryable<Customer> fullCustomerQuery = GetFullQuery();
    return fullCustomerQuery.Where(c => customersIds.Contains(c.Id)).ToList();
}
Run Code Online (Sandbox Code Playgroud)

这个查询被翻译成相当不错的SQL:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[FirstName] AS [FirstName]
-- ...
FROM [dbo].[Customer] AS [Extent1]
WHERE [Extent1].[Id] IN (1, 2, 3, 5)
Run Code Online (Sandbox Code Playgroud)

但是,我在查询编译阶段获得了非常显着的性能影响.呼叫:

ELinqQueryState.GetExecutionPlan(MergeOption? forMergeOption) 
Run Code Online (Sandbox Code Playgroud)

占用每个请求约50%的时间.深入研究,结果是每次我传递不同的customersIds时都会重新编译查询.根据MSDN文章,这是一个正常现象,因为IEnumerable的是在查询中使用被认为是挥发性的,并且是缓存的SQL的一部分.这就是为什么SQL对于customersIds的每个不同组合都是不同的,并且它总是具有用于从缓存中获取编译查询的不同哈希.

现在问题是:如何在仍然查询多个customersIds时避免重新编译?

linq performance linq-to-entities entity-framework

31
推荐指数
2
解决办法
3298
查看次数