Linq Rückkehr einzelner integer-Wert basierend auf string in SQL gespeichert
Ich bin ganz neu bei Linq,
Ich versuche nur zu tun, eine routine zurück, die in der Regel in SQL und kann nicht scheinen, um eine klare Antwort aus betrachten viele Foren mit Stunden surfen.
Ok, ich habe eine Tabelle Kunden mit zwei Spalten CustomerID und CustomerName, die gehören zu einer CustomersDataBase
Habe ich erfolgreich zurückkehren können einzelne Zeichenfolge aus einem integer-Abfrage mit der folgenden Methode (in seiner Grundform):
public string getCustomerName(int custID)
{
CustomerDataBase cdb = new CustomerDataBase();
string custName = (
from c in cdb.Customers
where c.CustomerID == custID
select c.CustomerName)
.SingleOrDefault();
return custName;
}
Ok das ist in Ordnung, aber wenn ich versuchen, Sie zu invertieren Sie die situation mit dem Versuch, die Rückkehr der CustomerID es gibt eine Ausnahme: System.InvalidCastException: die Angegebene Umwandlung ist ungültig.
Dies ist mein code:
public int getCustomerID(string custName)
{
CustomerDataBase cdb = new CustomerDataBase();
int custID = (
from c in cdb.Customers
where c.CustomerName == custName
select c.CustomerID)
.SingleOrDefault();
return custID;
}
Ich habe auch versucht denken-SQL-Bedingungen, um die custName string ein char-array:
public int getCustomerID(string custName)
{
CustomerDataBase cdb = new CustomerDataBase();
int custID = (
from c in cdb.Customers
where c.CustomerName == "'"+custName+"'"
select c.CustomerID)
.SingleOrDefault();
return custID;
}
Ausnahme verschwindet aber nur scheinbar wieder eine "0" für das Feld " CustomerID, obwohl ich Hunderte von Einträgen.
So, in SQL würde ich einfach folgende:
Select CustomerID
from Customers
where CustomerName="'"+custName+"'"
Jede Hilfe wäre sehr geschätzt werden! Dank
//Änderungen an code, damit es funktioniert (folgende Antwort von Jon Skeet):-
Ok, Das funktioniert:
[Table(Name = "TableCustomers")]
public class Kunden
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public long CustomerID { get; set; }
[Column]
public string CustomerName { get; set; }
[Column]
}
//für entgegenkommend für BigInt, SQL-Datenbank
öffentlichkeit lange getCustomerID(string custName)
{
CustomerDatabase cdb = new CustomerDatabase();
long custID = (from c in cdb.Customers
where c.CustomerName == custName
select c.CustomerID).SingleOrDefault();
return custID;
}
}
- Die letzten Abfrage keine Datensätze, die OrDefault (Teil) zurück int-0. Das ist, warum Sie nicht bekommen, eine cast exception. Was ist der Typ von "CustomerId" in deinem code?
- [Column(IsPrimaryKey = true, IsDbGenerated = true)] public int CustomerID { get; set; } Kunden-ID ist ungleich null und "BigInt" in der SQL-Datenbank als Primary Key
- Format verwende ich: [Table(Name = "TableCustomers")] public class Kunden { [Column(IsPrimaryKey = true, IsDbGenerated = true)] public int CustomerID { get; set; } [Column] public string CustomerName { get; set; }}
- Code funktioniert nicht gut in Kommentare. Sie sind berechtigt, zur Bearbeitung Ihrer Frage, um weitere Informationen hinzuzufügen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Letzte Ansatz ist definitiv falsch - Sie brauchen Sie nicht manuell zu "zitieren" - Parameter; du bist im Grunde auf der Suche nach einem Wert mit Anführungszeichen, und es ist die Rückkehr
0
ausSingleOrDefault
weil es noch nicht den Eintrag gefunden. (Das ist, wasSingleOrDefault
tut - es gibt den Standardwert für den Typ (int
hier), wenn es keine Ergebnisse.)Ich vermuten, dass Ihr
CustomerID
Spalte null-Werte zulässt, oder etwas ähnliches - aber es ist schwer zu sagen, ohne zu wissen, mehr über Ihre schema. Sie sollten überprüfen, ob Ihre LINQ to SQL-Modell passt zu Ihrem Datenbank-schema.Sollten Sie auch überlegen Sie, was Sie wollen passieren, wenn es mehrere Kunden mit dem gleichen Namen - derzeit ist dies eine Ausnahme, ist das, was Sie wollen?
EDIT: Okay, jetzt haben Sie endlich erzählte uns, was das schema hat, ist klar.
BigInt
ist ein 64-bit-integer-Zahl, aber Sie sind mit einem 32-bit-Eigenschaft in der LINQ-Modell. Ändern Sie einfachCustomerID
aus einerint
zulong
in Ihre LINQ-Modell, ändern Sie Ihre Methode, um wieder einelong
als gut, und es sollten alle in Ordnung sein.InvalidCastException
?1.System.Linq.IQueryProvider.Execute(Expression expression) +23 System.Linq.Queryable.SingleOrDefault(IQueryable
1 Quelle) +211 LinqDemo.TestingLinq.getCustomerID(String custName) in (Verändert).cs:77 TestLinq.Page_Load(Object sender, EventArgs e) in (Verändert).cs:16System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14CustomerID
.