Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq在集合上执行CRUD:如何?_C#_Sql Server 2005_Linq To Entities_Crud - Fatal编程技术网

C# 使用Linq在集合上执行CRUD:如何?

C# 使用Linq在集合上执行CRUD:如何?,c#,sql-server-2005,linq-to-entities,crud,C#,Sql Server 2005,Linq To Entities,Crud,使用Linq,尝试选择不在本地集中的所有记录失败: var localset = new List<Category>(); localset.Add( new Category { pk1 = 1, pk2 = 1, name = "one" } ); localset.Add( new Category { pk1 = 1, pk2 = 2, name = "two" } ); var dbCategories = dc.Categories; var diff = dbCa

使用Linq,尝试选择不在本地集中的所有记录失败:

var localset = new List<Category>();
localset.Add( new Category { pk1 = 1, pk2 = 1, name = "one" } );
localset.Add( new Category { pk1 = 1, pk2 = 2, name = "two" } );

var dbCategories = dc.Categories;

var diff = dbCategories.Except(localset);
我想这很容易。然而,.Contains似乎是唯一一种处理局部集的方法,而且它似乎只比较单个字段。数据库表具有复合键


在不更改组合键的情况下,有什么方法可以完成这些任务吗?

我不清楚您所说的方法是什么,恐怕。。。但使用复合键的一般解决方案是使用匿名类型生成单个值

例如,如果要在复合键上联接,可以使用

from x in xs
join y in ys on new { x.k1, x.k2 } equals new { y.k1, y.k2 }

这有帮助吗?

我不清楚你们所说的方法是什么,恐怕。。。但使用复合键的一般解决方案是使用匿名类型生成单个值

例如,如果要在复合键上联接,可以使用

from x in xs
join y in ys on new { x.k1, x.k2 } equals new { y.k1, y.k2 }
这有用吗?

这样做怎么样:

var localset = new List<Category>();
localset.Add(new Category { pk1 = 1, pk2 = 1, name = "one" });
localset.Add(new Category { pk1 = 1, pk2 = 2, name = "two" });

var flattened = localset
    .Select(dd => dd.pk1 + "|" + dd.pk2 + "|" + dd.name)
    .ToArray();

var dbCategories = dc.Categories;

var diff = from c in dbCategories
           let x = c.pk1 + "|" + c.pk2 + "|" + c.name
           where !flattened.Contains(x)
           select c;
var localset=newlist();
Add(新类别{pk1=1,pk2=1,name=“one”});
Add(新类别{pk1=1,pk2=2,name=“two”});
var=localset
.选择(dd=>dd.pk1+“|”+dd.pk2+“|”+dd.name)
.ToArray();
var dbCategories=dc.Categories;
var diff=来自dbCategories中的c
设x=c.pk1+“|”+c.pk2+“|”+c.name
哪里展平。包含(x)
选择c;
这将复合键转换为单个数组,允许您使用
Contains
运算符。如果有帮助,请告诉我。干杯。

这样做怎么样:

var localset = new List<Category>();
localset.Add(new Category { pk1 = 1, pk2 = 1, name = "one" });
localset.Add(new Category { pk1 = 1, pk2 = 2, name = "two" });

var flattened = localset
    .Select(dd => dd.pk1 + "|" + dd.pk2 + "|" + dd.name)
    .ToArray();

var dbCategories = dc.Categories;

var diff = from c in dbCategories
           let x = c.pk1 + "|" + c.pk2 + "|" + c.name
           where !flattened.Contains(x)
           select c;
var localset=newlist();
Add(新类别{pk1=1,pk2=1,name=“one”});
Add(新类别{pk1=1,pk2=2,name=“two”});
var=localset
.选择(dd=>dd.pk1+“|”+dd.pk2+“|”+dd.name)
.ToArray();
var dbCategories=dc.Categories;
var diff=来自dbCategories中的c
设x=c.pk1+“|”+c.pk2+“|”+c.name
哪里展平。包含(x)
选择c;

这将复合键转换为单个数组,允许您使用
Contains
运算符。如果有帮助,请告诉我。干杯。

您必须实现一个
类别比较程序,如下所示:

public class CategoryComparer : IEqualityComparer<Category>
{
    public bool Equals(Category a, Category b)
    {
        bool result = false;
        if( a.pk1 == b.pk1 && a.pk2 == b.pk2 && a.name == b.name)
            result = true;
        return result;    
    }

    public int GetHashCode(Category category)
    {        
        if (Object.ReferenceEquals(category, null)) return 0;        
        return category.pk1.GetHashCode() ^ category.pk2.GetHashCode();
    }
}
公共类类别比较程序:IEqualityComparer
{
公共布尔等于(a类、b类)
{
布尔结果=假;
如果(a.pk1==b.pk1&&a.pk2==b.pk2&&a.name==b.name)
结果=真;
返回结果;
}
public int GetHashCode(类别)
{        
if(Object.ReferenceEquals(category,null))返回0;
返回category.pk1.GetHashCode()^category.pk2.GetHashCode();
}
}
然后调用Enumerable。除了:

var localset = new List<Category>();
localset.Add( new Category { pk1 = 1, pk2 = 1, name = "one" } );
localset.Add( new Category { pk1 = 1, pk2 = 2, name = "two" } );

var diff = dc.Categories
             .AsEnumerable()
             .Except(localset, new CategoryComparer());
var localset=newlist();
Add(新类别{pk1=1,pk2=1,name=“one”});
Add(新类别{pk1=1,pk2=2,name=“two”});
var diff=dc.类别
.可计算的()
。除了(localset,new CategoryComparer());

如果这能满足您的需要,请告诉我。

您必须实现一个
类别比较程序,如下所示:

public class CategoryComparer : IEqualityComparer<Category>
{
    public bool Equals(Category a, Category b)
    {
        bool result = false;
        if( a.pk1 == b.pk1 && a.pk2 == b.pk2 && a.name == b.name)
            result = true;
        return result;    
    }

    public int GetHashCode(Category category)
    {        
        if (Object.ReferenceEquals(category, null)) return 0;        
        return category.pk1.GetHashCode() ^ category.pk2.GetHashCode();
    }
}
公共类类别比较程序:IEqualityComparer
{
公共布尔等于(a类、b类)
{
布尔结果=假;
如果(a.pk1==b.pk1&&a.pk2==b.pk2&&a.name==b.name)
结果=真;
返回结果;
}
public int GetHashCode(类别)
{        
if(Object.ReferenceEquals(category,null))返回0;
返回category.pk1.GetHashCode()^category.pk2.GetHashCode();
}
}
然后调用Enumerable。除了:

var localset = new List<Category>();
localset.Add( new Category { pk1 = 1, pk2 = 1, name = "one" } );
localset.Add( new Category { pk1 = 1, pk2 = 2, name = "two" } );

var diff = dc.Categories
             .AsEnumerable()
             .Except(localset, new CategoryComparer());
var localset=newlist();
Add(新类别{pk1=1,pk2=1,name=“one”});
Add(新类别{pk1=1,pk2=2,name=“two”});
var diff=dc.类别
.可计算的()
。除了(localset,new CategoryComparer());
如果这能满足你的需要,请告诉我