Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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# Linq2SQL和重复记录_C#_Asp.net_Linq To Sql - Fatal编程技术网

C# Linq2SQL和重复记录

C# Linq2SQL和重复记录,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,检查表中是否存在记录的最佳方法是什么。发生的情况是用户键入相同的名称,我需要查看它是否在数据库中。问题是,我希望在使用泛型的存储库基类上执行此操作。所以我不能去实体。名称 public void Save(T item) { Table<T> table = _db.GetTable<T>(); table.InsertOnSubmit(item); _db.SubmitChanges

检查表中是否存在记录的最佳方法是什么。发生的情况是用户键入相同的名称,我需要查看它是否在数据库中。问题是,我希望在使用泛型的存储库基类上执行此操作。所以我不能去实体。名称

public void Save(T item)
        {
            Table<T> table = _db.GetTable<T>();
            table.InsertOnSubmit(item);
            _db.SubmitChanges();
        }

谢谢

这将为您提供一个身份成员集合,您可以对集合中包含的项目的主键进行检查

_db.Mapping.GetTable(T).RowType.IdentityMembers

如果必须仅使用
DataContext
,则可以手动构建表达式。在本例中,我使用的是选择器表达式,但对属性名称(即“名称”)的反射也可以:

static void Main()
{
    string knownName;
    using (DataClasses1DataContext ctx = new DataClasses1DataContext())
    {
        knownName = ctx.Customers.First().CompanyName;
    }
    using (DataContext ctx = new DataClasses1DataContext())
    {
        Console.WriteLine(ctx.Any<Customer, string>(
             cust => cust.CompanyName, "none-such"));
        Console.WriteLine(ctx.Any<Customer, string>(
             cust => cust.CompanyName, knownName));
    }
}

static bool Any<TEntity, TValue>(
    this DataContext ctx,
    Expression<Func<TEntity, TValue>> selector,
    TValue value)
    where TEntity : class
{
    var lambda =
        Expression.Lambda<Func<TEntity, bool>>(
            Expression.Equal(
                selector.Body,
                Expression.Constant(value, typeof(TValue))),
                selector.Parameters);
    return ctx.GetTable<TEntity>().Any(lambda);
}
static void Main()
{
串名;
使用(DataClasses1DataContext ctx=newdataclasses1datacontext())
{
knownName=ctx.Customers.First().CompanyName;
}
使用(DataContext ctx=newdataclasses1datacontext())
{
控制台写入线(ctx.Any(
cust=>cust.CompanyName,“无此类”);
控制台写入线(ctx.Any(
cust=>cust.CompanyName,knownName));
}
}
静态布尔任何(
这是DataContext ctx,
表达式选择器,
t价值(价值)
地点:班级
{
兰姆达变种=
Lambda(
表达式。相等(
选择者,身体,
表达式.常量(值,类型(TValue)),
选择器(参数);
返回ctx.GetTable().Any(lambda);
}

基于字符串的方法将是:

using (DataContext ctx = new DataClasses1DataContext())
{
    Console.WriteLine(ctx.Any<Customer, string>("CompanyName", "none-such"));
    Console.WriteLine(ctx.Any<Customer, string>("CompanyName", knownName));
}
...
static bool Any<TEntity, TValue>(
    this DataContext ctx,
    string propertyOrFieldName,
    TValue value)
    where TEntity : class
{
    var param = Expression.Parameter(typeof(TEntity), "row");

    var lambda =
        Expression.Lambda<Func<TEntity, bool>>(
            Expression.Equal(
                Expression.PropertyOrField(param, propertyOrFieldName),
                Expression.Constant(value, typeof(TValue))),
                param);
    return ctx.GetTable<TEntity>().Any(lambda);
}
使用(DataContext ctx=newdataclasses1datacontext())
{
Console.WriteLine(ctx.Any(“公司名称”、“无该等”);
Console.WriteLine(ctx.Any(“CompanyName”,knownName));
}
...
静态布尔任何(
这是DataContext ctx,
字符串propertyOrFieldName,
t价值(价值)
地点:班级
{
var param=表达式参数(typeof(tenty),“row”);
兰姆达变种=
Lambda(
表达式。相等(
表达式.PropertyOrField(参数,propertyOrFieldName),
表达式.常量(值,类型(TValue)),
参数);
返回ctx.GetTable().Any(lambda);
}

\u db.Mapping.GetTable(T).RowType.IdentityMembers这将不起作用'T'是一个'type参数',但用作'variable'如何_db.Mapping.GetTable(item.GetType()).RowType.IdentityMembersMarc问题是我不想去指定(CompanyName)你说“发生的是用户键入相同的名称,我需要查看它是否在数据库中”,然后添加注释“我不想去指定(CompanyName)”。。。所以:既然我不认为我们讨论的是主键,那么您希望系统如何知道您希望比较哪个列以获得相等性?
using (DataContext ctx = new DataClasses1DataContext())
{
    Console.WriteLine(ctx.Any<Customer, string>("CompanyName", "none-such"));
    Console.WriteLine(ctx.Any<Customer, string>("CompanyName", knownName));
}
...
static bool Any<TEntity, TValue>(
    this DataContext ctx,
    string propertyOrFieldName,
    TValue value)
    where TEntity : class
{
    var param = Expression.Parameter(typeof(TEntity), "row");

    var lambda =
        Expression.Lambda<Func<TEntity, bool>>(
            Expression.Equal(
                Expression.PropertyOrField(param, propertyOrFieldName),
                Expression.Constant(value, typeof(TValue))),
                param);
    return ctx.GetTable<TEntity>().Any(lambda);
}